Faits :
A.
Par jugement du Tribunal pénal de la Gruyère du 19 décembre 2019, A._ a été reconnu coupable de vol et de brigandage, et condamné à une peine privative de liberté de 18 mois, dont 12 mois avec sursis pendant cinq ans. Le Tribunal pénal a en revanche renoncé à prononcer l'expulsion de A._ du territoire suisse. Il a en outre révoqué un sursis antérieur et pris acte du passé-expédient de A._ sur les conclusions civiles de B._.
B.
Par arrêt du 9 novembre 2020, la Cour d'appel pénal du Tribunal cantonal du canton de Fribourg a admis l'appel du Ministère public du canton de Fribourg et partiellement admis l'appel joint de A._. Elle a réformé le jugement de première instance en ce sens que A._ a été condamné à une peine privative de liberté de 18 mois avec sursis pendant 5 ans et prononcé son expulsion du territoire suisse pour une durée de 5 ans. Elle a confirmé le jugement de première instance pour le surplus.
En substance, l'arrêt attaqué se fonde sur les faits suivants.
B.a. A._ est de nationalité marocaine, pays dans lequel il est né en 1980 et où il a effectué sa scolarité. Il a quitté son pays d'origine pour des raisons économiques et est arrivé en Suisse en 2010 où il a commencé à travailler au noir. Il s'est marié une première fois en 2011, avant de divorcer, puis de se remarier en 2015 avec son épouse actuelle, une ressortissante portugaise avec laquelle il a un fils, né en septembre 2014. A._ est titulaire d'une autorisation de séjour, alors que son épouse bénéficie d'une autorisation d'établissement. A._, son épouse et leur fils vivent ensemble dans un appartement en location. Ils sont tous les trois en bonne santé. A._ exerce une activité professionnelle en qualité de magasinier, alors que son épouse est actuellement en formation. Devant la cour cantonale, il a indiqué qu'elle la terminerait en été 2021 et que lui-même avait la perspective d'entreprendre un CFC en cours d'emploi dans deux ans environ.
B.b. Le casier judiciaire suisse de A._ fait état des condamnations suivantes: le 24 novembre 2009, peine pécuniaire de 40 jours-amende avec sursis pour séjour illégal et activité lucrative sans autorisation; le 2 décembre 2010, peine pécuniaire de 25 jours-amende avec sursis et amende de 200 fr. pour vol, violation de domicile et recel; le 30 novembre 2012, peine pécuniaire de 20 jours-amende avec sursis pour activité lucrative sans autorisation; le 9 décembre 2013, peine pécuniaire de 50 jours-amende avec sursis et amende de 300 fr. pour dommages à la propriété, utilisation abusive d'une installation de télécommunication, menaces, contrainte et injure; le 14 octobre 2014, peine pécuniaire de 30 jours-amende avec sursis et amende de 500 fr. pour violation grave des règles de la circulation routière.
B.c. Entre le 2 juin et le 26 juin 2018, dans quatre établissements de restauration différents, A._ a dérobé à chaque fois une bourse de sommelière contenant plusieurs centaines de francs. En outre, le 20 juin 2018, à l'Auberge X._ à Y._, A._ a dérobé une bourse de sommelière contenant un montant de 450 francs. Alors qu'il tentait de prendre la fuite avec la bourse, il a été surpris par la tenancière de l'établissement, B._. Celle-ci est intervenue afin de récupérer son bien et a agrippé le voleur par son t-shirt. Pour se dégager, celui-ci s'est retourné et a violemment poussé B._ avec sa main sur son visage. Elle a été déséquilibrée et est tombée par terre. A._ est parti avec la bourse.
C.
A._ forme un recours en matière pénale au Tribunal fédéral. Il conclut principalement, avec suite de frais et dépens, à la réforme de l'arrêt entrepris en ce sens qu'il est acquitté du chef de prévention de brigandage, subsidiairement, qu'il est renoncé à son expulsion du territoire suisse, plus subsidiairement encore, que la cause est renvoyée à l'autorité cantonale pour nouvelle décision. Il sollicite également l'effet suspensif dans la mesure où il ne serait pas assorti à son recours de plein droit, ainsi que le bénéfice de l'assistance judiciaire.
D.
Invités à se déterminer sur le recours, la Cour d'appel pénal du Tribunal cantonal fribourgeois a renoncé à présenter des observations, tandis que le ministère public s'est reporté aux considérants de l'arrêt attaqué ainsi qu'aux motifs exposés dans sa déclaration d'appel du 14 février 2020.
E.
Le 18 novembre 2021, le Tribunal fédéral a délibéré en séance publique.
Considérant en droit :
1.
A l'appui de son recours, le recourant produit des pièces postérieures à la notification du dispositif de l'arrêt querellé. Or, selon l'art. 99 al. 1 LTF, aucun fait nouveau ni preuve nouvelle ne peut être présenté devant le Tribunal de céans, à moins de résulter de la décision de l'autorité précédente. Le Tribunal fédéral ne peut pas tenir compte de faits ou moyens de preuve survenus postérieurement au prononcé de la décision entreprise, c'est-à-dire de véritables nova (cf. ATF 139 III 120 consid. 3.1.2 p. 123; arrêt 6B_1109/2019 du 23 septembre 2020 consid. 1.4.1).
Il s'ensuit que les pièces produites par le recourant sont irrecevables.
2.
Le recourant se plaint d'arbitraire dans l'établissement des faits retenus à l'appui de sa condamnation pour brigandage et invoque également la violation du principe de présomption d'innocence. Il fait grief à la cour cantonale d'avoir privilégié la version des faits de B._ à la sienne.
2.1. Le Tribunal fédéral n'est pas une autorité d'appel, auprès de laquelle les faits pourraient être rediscutés librement. Il est lié par les constatations de fait de la décision entreprise (art. 105 al. 1 LTF), à moins qu'elles n'aient été établies en violation du droit ou de manière manifestement inexacte au sens des art. 97 al. 1 et 105 al. 2 LTF, soit pour l'essentiel de façon arbitraire au sens de l'art. 9 Cst. Une décision n'est pas arbitraire du seul fait qu'elle apparaît discutable ou même critiquable; il faut qu'elle soit manifestement insoutenable et cela non seulement dans sa motivation mais aussi dans son résultat. Le Tribunal fédéral n'entre pas en matière sur les critiques de nature appellatoire (ATF 145 IV 154 consid. 1.1. p. 155 s.).
La présomption d'innocence, garantie par les art. 10 CPP, 32 al. 1 Cst., 14 par. 2 Pacte ONU II et 6 par. 2 CEDH, ainsi que son corollaire, le principe "in dubio pro reo", concernent tant le fardeau de la preuve que l'appréciation des preuves au sens large (ATF 144 IV 345 consid. 2.2.3.1 p. 348 s.; 127 I 38 consid. 2a p. 40 s.). En tant que règle sur le fardeau de la preuve, elle signifie, au stade du jugement, que le fardeau de la preuve incombe à l'accusation et que le doute doit profiter au prévenu. Comme règle d'appréciation des preuves (sur la portée et le sens précis de la règle sous cet angle, cf. ATF 144 IV 345 consid. 2.2.3.3 p. 351 s.), la présomption d'innocence signifie que le juge ne doit pas se déclarer convaincu de l'existence d'un fait défavorable à l'accusé si, d'un point de vue objectif, il existe des doutes quant à l'existence de ce fait. Il importe peu qu'il subsiste des doutes seulement abstraits et théoriques, qui sont toujours possibles, une certitude absolue ne pouvant être exigée. Il doit s'agir de doutes sérieux et irréductibles, c'est-à-dire de doutes qui s'imposent à l'esprit en fonction de la situation objective. Lorsque, comme en l'espèce, l'appréciation des preuves et la constatation des faits sont critiquées en référence au principe "in dubio pro reo", celui-ci n'a pas de portée plus large que l'interdiction de l'arbitraire (ATF 145 IV 154 consid. 1.1 p. 155 s. et les références citées).
2.2. La cour cantonale a retenu que, au moment où il avait été surpris par B._ en train de voler sa bourse, le recourant avait pris la fuite avec son butin. Il avait été rattrapé par la prénommée, qui l'avait saisi par le t-shirt. Pour se dégager, il l'avait poussée avec force en mettant sa main sur son visage, ce qui l'avait fait tomber au sol après avoir heurté un mur.
2.3. Le recourant soutient que la cour cantonale ne disposait d'aucune preuve sérieuse que B._ était tombée parce qu'il l'avait poussée. Il était aussi possible qu'elle soit tombée seulement parce qu'elle courait derrière lui en lui tenant le t-shirt, comme il l'avait déclaré à réitérées reprises. Il était arbitraire de donner davantage de crédit aux déclarations de la partie plaignante au motif que celle-ci, contrairement à lui, avait pu être entendue le jour des faits. Enfin, l'autorité précédente aurait dû tenir compte du fait que les déclarations de B._ n'étaient pas constantes.
2.4. La cour cantonale a constaté que B._ n'avait pas fait de déclarations contradictoires. Si elle avait certes utilisé des mots légèrement différents, à savoir, devant la police "il s'est retourné et m'a violemment poussée avec sa main sur mon visage. J'ai été déséquilibrée, je suis tombée contre le mur puis au sol", puis devant le ministère public, "c'est là qu'on s'est battus. Il s'est retourné vers moi et m'a donné une claque et m'a poussée. Je suis tombée en arrière contre le mur, puis sur le sol", elle avait bien décrit la même scène en ce qui concernait l'usage de la violence dont elle avait fait l'objet, avec des variations mineures ne comportant pas de contradiction. En tant que le recourant affirme que B._ s'est contredite, il ne fait qu'opposer sa propre appréciation à celle de la cour cantonale, dans une démarche purement appellatoire. Son argumentation est irrecevable dans cette mesure (consid. 2.1 supra).
Le recourant procède également de manière appellatoire lorsqu'il soutient que B._ avait pu tomber sans qu'il ne la pousse. Au demeurant, il n'était pas arbitraire de juger plus plausible que la prénommée ait perdu l'équilibre de manière tellement brutale au point de se cogner la tête contre un mur avant de tomber par terre parce que le recourant l'avait violemment poussée, plutôt que par le simple fait qu'elle courait derrière lui en agrippant son t-shirt. Par ailleurs, il n'y a rien d'insoutenable à accorder un crédit particulier aux déclarations de la victime dans la mesure où elles avaient pu être recueillies directement après les faits. En ce qui concerne la crédibilité de la version des faits donnée par le recourant, la cour cantonale a constaté que le prénommé avait tout d'abord intégralement nié les faits, puis admis les vols après avoir été confronté aux preuves techniques le désignant comme l'auteur des infractions. L'autorité précédente pouvait ainsi considérer sans arbitraire que les déclarations du recourant avaient varié et qu'il avait intérêt, une fois admis ceux qui étaient démontrés par preuve, à minimiser leur portée, en particulier en niant avoir poussé B._.
Compte tenu de l'ensemble de ces éléments, le recourant échoue à démontrer que les faits sur lesquels reposent l'infraction de brigandage auraient été établis de manière arbitraire. Son grief est rejeté, dans la mesure où il est recevable.
3.
Invoquant la violation des art. 12 et 140 CP, le recourant conteste la qualification juridique de brigandage. Il soutient que la cour cantonale n'a pas correctement apprécié la notion de dol éventuel au regard des faits retenus et des éléments à prendre en considération.
3.1. Selon l'art. 140 ch. 1 al. 1 CP, se rend coupable de brigandage celui qui aura commis un vol en usant de violence à l'égard d'une personne, en la menaçant d'un danger imminent pour la vie ou l'intégrité corporelle ou en la mettant hors d'état de résister. Conformément à l'art. 140 ch. 1 al. 2 CP, celui qui, pris en flagrant délit de vol, aura commis un des actes de contrainte mentionnés à l'al. 1 dans le but de garder la chose volée encourra la même peine.
La jurisprudence distingue le cas de l'auteur qui exerce une contrainte après le vol pour assurer sa fuite de celui qui agit pour conserver le butin. Dans le premier cas, il ne s'agit pas d'un brigandage. En revanche, quand l'auteur exerce une contrainte à la fois pour conserver le butin et assurer sa fuite, il commet l'infraction (ATF 92 IV 153 consid. 1; arrêt 6B_651/2018 du 17 octobre 2018 consid. 6.3).
Selon l'art. 12 al. 2 CP, agit intentionnellement quiconque commet un crime ou un délit avec conscience et volonté. L'auteur agit déjà avec intention, sous la forme du dol éventuel, lorsqu'il tient pour possible la réalisation de l'infraction et l'accepte pour le cas où celle-ci se produirait. Le dol éventuel suppose que l'auteur, qui ne veut pas le résultat dommageable pour lui-même, envisage le résultat de son acte comme possible et l'accepte au cas où il se produirait (ATF 135 IV 152 consid. 2.3.2 p. 156; 133 IV 9 consid. 4.1 p. 16 s.; 131 IV 1 consid. 2.2 p. 4).
Déterminer ce qu'une personne a su, voulu, envisagé ou accepté relève du contenu de la pensée, à savoir de faits "internes", qui, en tant que faits, lient le Tribunal fédéral (art. 105 al. 1 LTF), à moins qu'ils n'aient été retenus de manière arbitraire (ATF 141 IV 369 consid. 6.3 p. 375; cf. ATF 142 IV 137 consid. 12 p. 152). Est en revanche une question de droit celle de savoir si l'autorité cantonale s'est fondée sur une juste conception de la notion d'intention et si elle l'a correctement appliquée sur la base des faits retenus et des éléments à prendre en considération (ATF 137 IV 1 consid. 4.2.3 p. 4 s.; 135 IV 152 consid. 2.3.2 p. 156; 133 IV 9 consid. 4.1 p. 16 s.).
3.2. La cour cantonale a constaté, d'une part, que le recourant avait usé de violence et, d'autre part, que son action sur le corps de la victime était d'une intensité normalement suffisante pour empêcher celle-ci de s'opposer au départ du recourant avec son butin. Son action ne pouvait être comparée à celle de bousculer la victime pour la distraire ou de lui saisir brièvement le bras. Elle était clairement destinée à briser la résistance de la victime et ce but avait été atteint dès lors que cette dernière était tombée au sol. Dans ces conditions, la cour cantonale a retenu qu'en portant la main sur le visage de la victime, le recourant s'était accommodé de l'usage de cette violence, même s'il ne souhaitait pas faire tomber sa victime, mais seulement l'empêcher de le retenir. Il avait ainsi commis l'infraction de brigandage à tout le moins par dol éventuel.
3.3. Le recourant se limite à faire valoir qu'il avait précédemment volé trois autres bourses sans avoir usé de violence ou d'un quelconque moyen de contrainte. Cependant, il n'explique nullement en quoi les circonstances des vols précédents auraient été similaires à celui d'espèce; en particulier, il n'a pas été constaté que dans les autres cas, le recourant aurait été entravé dans sa fuite, ni qu'il aurait préféré renoncer à son butin plutôt que d'avoir un geste violent. Par ce moyen, le recourant ne démontre aucunement en quoi la cour cantonale aurait faussement appliqué la conception de dol éventuel dans le cas d'espèce. Pour le reste, le raisonnement de la cour cantonale, qui l'a conduite à retenir le dol éventuel, ne prête pas le flanc à la critique. Le grief est rejeté.
3.4. Pour le surplus, les autres éléments constitutifs de l'infraction sont réalisés, ce que le recourant ne conteste pas; en particulier, il ne prétend pas qu'il aurait repoussé B._ uniquement dans le but de couvrir sa fuite (ce qui n'a d'ailleurs pas été retenu dans l'état de fait cantonal). Sa condamnation du chef d'infraction de brigandage ne viole donc pas le droit fédéral.
4.
Le recourant reproche à la cour cantonale de ne pas avoir renoncé à ordonner son expulsion sur la base de l'art. 66a al. 2 CP et de l'art. 8 par. 2 CEDH.
4.1. Dans son jugement du 19 décembre 2019, le tribunal de première instance a renoncé à l'expulsion du recourant du territoire suisse. Il a notamment considéré que si les infractions reprochées au recourant n'avaient porté que sur le vol de cinq bourses de sommelière, aucune mesure d'expulsion n'aurait été envisagée, et que le seul geste d'avoir donné une claque à B._ pour conserver la bourse ne pouvait dès lors pas justifier une expulsion du territoire suisse pour une durée de 5 ans.
La cour cantonale n'a pas partagé l'appréciation du tribunal de première instance. Elle a considéré que si le recourant vivait en Suisse depuis environ dix ans et y avait fondé une famille, il n'avait pas créé avec ce pays des liens sociaux et professionnels supérieurs à ceux qui résulteraient d'une intégration ordinaire. Originaire du Maroc, il y avait encore de la famille. Hormis son épouse et leur enfant, il n'avait aucune famille proche en Suisse. Son épouse était de nationalité portugaise et elle n'était arrivée en Suisse qu'à l'âge de 29 ans, soit il y a moins de dix ans. Durant son séjour en Suisse, il avait été condamné - avant la présente condamnation - à multiples reprises pour différentes infractions à des peines pécuniaires avec sursis. Si les infractions commises n'étaient pas forcément très graves, leur répétition tendait néanmoins à indiquer une difficulté certaine à respecter l'ordre légal. Son renvoi ne représentait pas un risque pour sa personne ou sa famille, d'autant qu'ils auraient la possibilité de s'établir tant au Maroc qu'au Portugal. Le simple fait de perdre un emploi en Suisse et de devoir vivre pendant quelques années dans un autre pays ne constituait pas en lui-même une situation personnelle grave. Il ne s'agissait que d'un inconvénient, par ailleurs inhérent à la nature même de l'expulsion. Il en allait par ailleurs de même dans l'hypothèse où l'épouse du recourant déciderait de rester en Suisse avec leur fils. L'expulsion porterait certes alors une atteinte aux relations entre le recourant et son épouse et leur enfant, mais cette mesure resterait d'une durée limitée - soit cinq années - et ne l'empêcherait pas d'entretenir un contact avec ceux-ci par le biais des moyens de communication modernes et de les retrouver lors de séjours communs au Maroc ou au Portugal. Dans ces conditions, la cour cantonale a considéré que l'expulsion du recourant ne le plaçait pas dans une situation personnelle grave. La première condition cumulative de l'art. 66a CP n'étant pas remplie, point n'était besoin d'examiner dans quelle mesure les intérêts publics à l'expulsion l'emporteraient sur l'intérêt privé du recourant à demeurer en Suisse.
4.2. Aux termes de l'art. 66a al. 1 let. c CP, le juge expulse de Suisse l'étranger qui est condamné notamment pour brigandage (art. 140 CP), quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de 5 à 15 ans. Selon l'art. 66a al. 2 CP, le juge peut exceptionnellement renoncer à une expulsion lorsque celle-ci mettrait l'étranger dans une situation personnelle grave et que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. A cet égard, il tiendra compte de la situation particulière de l'étranger qui est né ou qui a grandi en Suisse.
4.2.1. La clause de rigueur permet de garantir le principe de la proportionnalité (art. 5 al. 2 Cst.). Elle doit être appliquée de manière restrictive (ATF 146 IV 105 consid. 3.4.2 p. 108; 144 IV 332 consid. 3.3.1 p. 340). Selon la jurisprudence du Tribunal fédéral (ATF 146 IV 105 consid. 3.4 p. 108 ss; 144 IV 332 consid. 3.3.2 p. 340 s.), il convient de s'inspirer des critères énoncés à l'art. 31 de l'ordonnance du 24 octobre 2007 relative à l'admission, au séjour et à l'exercice d'une activité lucrative (OASA; RS 142.201). L'art. 31 al. 1 OASA prévoit qu'une autorisation de séjour peut être octroyée dans les cas individuels d'extrême gravité. L'autorité doit tenir compte notamment de l'intégration du requérant selon les critères définis à l'art. 58a al. 1 de la loi fédérale sur les étrangers et l'intégration (LEI; RS 142.20), de la situation familiale, particulièrement de la période de scolarisation et de la durée de la scolarité des enfants, de la situation financière, de la durée de la présence en Suisse, de l'état de santé ainsi que des possibilités de réintégration dans l'État de provenance. Comme la liste de l'art. 31 al. 1 OASA n'est pas exhaustive et que l'expulsion relève du droit pénal, le juge devra également, dans l'examen du cas de rigueur, tenir compte des perspectives de réinsertion sociale du condamné (ATF 144 IV 332 consid. 3.3.2 p. 340 s.). En règle générale, il convient d'admettre l'existence d'un cas de rigueur au sens de l'art. 66a al. 2 CP lorsque l'expulsion constituerait, pour l'intéressé, une ingérence d'une certaine importance dans son droit au respect de sa vie privée et familiale garanti par la Constitution fédérale (art. 13 Cst.) et par le droit international, en particulier l'art. 8 CEDH (arrêts 6B_177/2021 du 8 novembre 2021 consid. 3.1.1; 6B_316/2021 du 30 septembre 2021 consid. 2.3; 6B_94/2021 du 29 septembre 2021 consid. 7.2).
4.2.2. L'art. 66a CP doit être interprété conformément à la CEDH. La pesée des intérêts dans le cadre de la clause de rigueur de l'art. 66a al. 2 CP doit donc être guidée par le critère de proportionnalité de l'art. 8 par. 2 CEDH (ATF 145 IV 161 consid. 3.4 p. 166 s.; arrêts 6B_1258/2020 du 12 novembre 2021 consid. 4.2.4; 6B_855/2020 du 25 octobre 2021 consid. 3.2.4; 6B_877/2021 du 7 octobre 2021 consid. 4.1). Cette disposition impose de déterminer si la mesure prise respecte un juste équilibre entre, d'une part, le droit de l'intéressé au respect de sa vie privée et familiale, et, d'autre part, la protection de l'ordre public et la prévention des infractions pénales (arrêts de la CourEDH K.M. c. Suisse [requête n° 6009/10], § 53; Hasanbasic c. Suisse du 11 juin 2013 [requête n° 52166/09], § 56; Emre c. Suisse du 22 mai 2008 [requête n° 42034/04], § 64; Boultif c. Suisse du 2 août 2001, Recueil de la CourEDH 2001-IX p. 137 § 47).
Selon la jurisprudence, pour se prévaloir du droit au respect de sa vie privée au sens de l'art. 8 par. 1 CEDH, l'étranger doit établir l'existence de liens sociaux et professionnels spécialement intenses avec la Suisse, notablement supérieurs à ceux qui résultent d'une intégration ordinaire. Le Tribunal fédéral n'adopte pas une approche schématique qui consisterait à présumer, à partir d'une certaine durée de séjour en Suisse, que l'étranger y est enraciné et dispose de ce fait d'un droit de présence dans notre pays. Il procède bien plutôt à une pesée des intérêts en présence, en considérant la durée du séjour en Suisse comme un élément parmi d'autres et en n'accordant qu'un faible poids aux années passées en Suisse dans l'illégalité, en prison ou au bénéfice d'une simple tolérance (cf. ATF 134 II 10 consid. 4.3 p. 24; arrêt 6B_316/2021 précité consid. 2.3). Un séjour légal de dix années suppose en principe une bonne intégration de l'étranger (ATF 144 I 266 consid. 3.9 p. 278).
Un étranger peut se prévaloir de l'art. 8 par. 1 CEDH (et de l'art. 13 Cst.), qui garantit notamment le droit au respect de la vie familiale, pour s'opposer à l'éventuelle séparation de sa famille (ATF 144 II 1 consid. 6.1 p. 12; 139 I 330 consid. 2.1 p. 336 et les références citées). Les relations familiales visées par l'art. 8 par. 1 CEDH sont avant tout celles qui concernent la famille dite nucléaire, soit celles qui existent entre époux ainsi qu'entre parents et enfants mineurs vivant en ménage commun (cf. ATF 144 II 1 consid. 6.1 p. 12; 135 I 143 consid. 1.3.2 p. 146). Pour qu'il puisse invoquer la protection de la vie familiale découlant de l'art. 8 CEDH, l'étranger doit entretenir une relation étroite et effective avec une personne de sa famille ayant le droit de résider durablement en Suisse (cf. ATF 144 II 1 consid. 6.1 p. 12; 139 I 330 consid. 2.1 p. 336 et les références citées). Par ailleurs, il n'y a pas atteinte à la vie familiale si l'on peut attendre des personnes concernées qu'elles réalisent leur vie de famille à l'étranger; l'art. 8 CEDH n'est pas a priori violé si le membre de la famille jouissant d'un droit de présence en Suisse peut quitter ce pays sans difficultés avec l'étranger auquel a été refusée une autorisation de séjour. En revanche, si le départ du membre de la famille pouvant rester en Suisse ne peut d'emblée être exigé sans autres difficultés, il convient de procéder à la pesée des intérêts prévue par l'art. 8 par. 2 CEDH (ATF 144 I 91 consid. 4.2 p. 96; 140 I 145 consid. 3.1 p. 147).
4.2.3. Compte tenu des circonstances du cas d'espèce, il s'agit tout d'abord de déterminer si le recourant remplit les conditions lui permettant d'invoquer un droit au respect de sa vie familiale (consid. 4.2.2 supra par. 3). En l'espèce, le prénommé vit depuis 2014 en ménage commun avec son épouse - de nationalité portugaise et au bénéfice d'une autorisation d'établissement en Suisse - et, depuis sa naissance la même année, avec leur enfant de sept ans, sur lequel il exerce l'autorité parentale conjointe et à l'entretien duquel il contribue (jugement de première instance du 19 décembre 2019 p. 25, pièce 100'136). Partant, on doit admettre que le recourant entretient avec des membres de sa famille - au bénéfice d'un droit de séjour durable en Suisse - une relation étroite et effective au sens de la jurisprudence précitée.
En outre, il ressort de l'état de fait cantonal que l'épouse poursuivait un apprentissage en cours d'emploi en Suisse, qui devait se terminer en été 2021. Leur enfant, né en Suisse, y est scolarisé. La décision cantonale ne contient aucune information en rapport avec d'éventuels voyages de la famille au Maroc. En tous les cas, l'épouse et l'enfant du recourant n'y ont jamais vécu et il n'est pas constaté qu'ils parleraient l'arabe. Le cas d'espèce se distingue donc de celui dans lequel les deux conjoints partagent la même nationalité, ce qui peut faciliter le retour dans le pays d'origine commun (cf. par ex. arrêt 6B_286/2020 du 1er juillet 2020 consid. 1.4.3). De toute évidence, le départ des membres de la famille du recourant pouvant rester en Suisse ne peut d'emblée être exigé sans autres difficultés.
Sur le vu de ce qui précède, le recourant peut se prévaloir d'une atteinte à sa vie familiale au sens de l'art. 8 par. 1 CEDH. Aussi doit-on considérer, contrairement à ce qu'a retenu la cour cantonale et conformément à la jurisprudence précitée (voir en particulier: consid. 4.2.1 in fine supra), que son expulsion le placerait dans une situation personnelle grave au sens de l'art. 66a al. 2 CP. Dans ces conditions, il importe peu de savoir s'il pourrait également se prévaloir de liens sociaux et professionnels supérieurs à ceux qui résultent d'une intégration ordinaire en Suisse et invoquer ainsi une ingérence dans son droit au respect de sa vie privée.
4.3. Il convient dès lors d'examiner la deuxième condition de l'art. 66a al. 2 CP et de procéder à la pesée des intérêts en présence selon l'art. 8 par. 2 CEDH, étant encore précisé que, même si elle a considéré que l'expulsion ne placerait pas le recourant dans une situation personnelle grave, la cour cantonale a néanmoins discuté les éléments de fait qui interviennent dans l'examen de la proportionnalité.
4.3.1. Selon la jurisprudence de la CourEDH, dans la mesure où elle porte atteinte à un droit protégé par le par. 1 de l'art. 8 CEDH, la décision d'expulsion doit se révéler nécessaire dans une société démocratique, c'est-à-dire être justifiée par un besoin social impérieux et, notamment, proportionnée au but légitime poursuivi. S'agissant d'un étranger arrivé en Suisse à l'âge adulte, l'examen de la proportionnalité suppose une prise en compte de la nature et de la gravité de la faute, du temps écoulé depuis la commission de l'infraction, du comportement de l'auteur durant cette période, de la durée de son séjour en Suisse et de la solidité des liens sociaux, culturels et familiaux avec le pays hôte et avec le pays de destination (arrêts de la CourEDH E.V. c. Suisse du 18 mai 2021 [requête n° 77220/16], § 34; M.M. c. Suisse du 8 décembre 2020 [requête n° 59006/18], § 49; avec de nombreuses références; cf. ATF 139 I 145 consid. 2.4 p. 149; 139 I 31 consid. 2.3.3 p. 34 ss; 6B_855/2020 précité consid. 3.2.5; 6B_693/2020 du 18 janvier 2021 consid. 7.1.1). La question de savoir si l'atteinte à la garantie de la vie familiale est "nécessaire" au sens de l'art. 8 par. 2 CEDH implique en outre de prendre en considération les critères suivants: la nationalité des diverses personnes concernées; la situation familiale de l'intéressé, notamment, le cas échéant, la durée de son mariage, et d'autres facteurs témoignant de l'effectivité d'une vie familiale au sein d'un couple; la question de savoir si le conjoint avait connaissance de l'infraction à l'époque de la création de la relation familiale; la question de savoir si des enfants sont issus du mariage et, dans ce cas, leur âge, ainsi que la gravité des difficultés que le conjoint et les enfants risquent de rencontrer dans le pays vers lequel l'intéressé doit être expulsé (cf. arrêts de la CourEDH Z. c. Suisse du 22 décembre 2020 [requête n° 6325/15, § 57] ; I.M. c. Suisse du 9 avril 2019 [requête n° 23887/16], § 69; Kissiwa Koffi c. Suisse du 15 novembre 2012 [requête n° 38005/07], § 63; Üner c. Pays-Bas du 18 octobre 2006, [requête n° 46410/99], §§ 57 s.; Sezen c. Pays-Bas du 31 janvier 2006 [requête n° 50252/99], § 42; Boultif précité, § 48; voir également les arrêts 6B_855/2020 précité consid. 3.3.1; 6B_249/2020 du 27 mai 2021 consid. 5.4.1; 6B_131/2019 du 27 septembre 2019 consid. 2.5.3).
La CourEDH a précisé que si des enfants sont concernés, leur intérêt supérieur doit également être pris en compte en tant qu'élément essentiel de la mise en balance des intérêts (arrêts de la CourEDH Usmanov c. Russie du 22 décembre 2020 [requête n° 43936/18], § 56; aussi: ATF 143 I 21 consid. 5.5.1 p. 29; arrêt 6B_1275/2020 du 4 mars 2021 consid. 1.4.3). La CourEDH considère que, dans le cas de relations familiales intactes avec des droits de garde et d'autorité parentale conjoints des parents, l'expulsion entraîne une rupture de la relation étroite de l'enfant avec l'un des parents si l'on ne peut raisonnablement s'attendre à ce que les autres membres de la famille et en particulier l'autre parent, qui a également des droits de garde et d'autorité parentale, s'installent dans le pays d'origine de l'autre parent. Cela ne va pas dans le sens de l'intérêt supérieur de l'enfant et fait donc en principe obstacle à l'expulsion. Une expulsion qui conduit à la séparation de la communauté familiale précédemment intacte des parents et des enfants constitue une très grave atteinte au droit au respect de la vie familiale protégé par l'art. 8 par. 1 de la CEDH (voir les arrêts de la CourEDH Sezen précité, § 49; Mehemi c. France (n° 2) du 10 avril 2003 [requête n° 53470/99], § 45; arrêt 6B_855/2020 précité consid. 3.3.2). La décision de renvoi ne peut être prise dans ce cas qu'après une mise en balance approfondie et complète des intérêts et uniquement sur la base de considérations ayant suffisamment de poids et de solidité (voir arrêts de la CourEDH Olsson c. Suède (n° 1) du 24 mars 1988 [requête n° 10465/83], § 72, cité dans l'arrêt CourEDH Mehemi précité; voir aussi: arrêt 6B_855/2020 précité consid. 3.3.2).
4.3.2. Dans des affaires récentes concernant la conformité à l'art. 8 CEDH de l'éloignement de résidents de longue date, la CourEDH a constaté que lorsque les juridictions internes avaient soigneusement examiné les faits et appliqué la jurisprudence des organes de la Convention et qu'elles avaient dûment mis en balance l'intérêt particulier du requérant et l'intérêt public de la collectivité afin de tirer des conclusions qui n'étaient ni arbitraires ni manifestement déraisonnables, il ne lui appartenait pas de substituer sa propre appréciation du fond de l'affaire à celle des autorités nationales compétentes (notamment en ce qui concerne les éléments factuels de la proportionnalité), à moins qu'il n'y eût de bonnes raisons de le faire (arrêts de la CourEDH E.V. précité, § 37; Z. c. Suisse du 22 décembre 2020 [requête n° 6325/15], § 60; Ndid c. Royaume-Uni du 14 septembre 2017 [requête n° 41215/14], § 76; Saber et Boughassal c. Espagne du 18 décembre 2018 [requêtes n° 76550/13 et 45938/14], § 41). L'appréciation des faits pertinents doit être "acceptable" (arrêt de la CourEDH Saber et Boughassal précité, § 41). La CourEDH a également rappelé que les juridictions internes doivent motiver leurs décisions de manière suffisamment circonstanciée, afin notamment de lui permettre d'assurer le contrôle européen qui lui est confié (arrêts de la CourEDH E.V. précité, § 39; Z. précité, § 59; M.M. précité, § 53; El Ghatet c. Suisse du 8 novembre 2016 [requête n° 56971/10], § 47; X c. Lettonie [GC] [requête n° 27853/09], § 107, CEDH 2013). Un raisonnement insuffisant des juridictions internes, sans véritable mise en balance des intérêts en présence, est contraire aux exigences de l'art. 8 de la Convention. C'est le cas lorsque les autorités internes ne parviennent pas à démontrer de manière convaincante que l'ingérence dans un droit protégé par la Convention est proportionnée aux buts poursuivis et qu'elle correspond dès lors à un "besoin social impérieux" au sens de la jurisprudence précitée (voir les arrêts de la CourEDH El Ghatet précité, § 47 et I.M. précité, §§ 72 et 77).
4.3.3. Il convient tout d'abord de relever que le recourant peut se prévaloir d'une durée de séjour dans le pays d'accueil non négligeable (environ 10 ans), quoiqu'en partie illégale. Il est inséré dans la vie économique puisqu'il exerce une activité lucrative et il entretient à tout le moins une relation d'amitié (audition de C._ du 19 décembre 2019, pièce 100'086; cf. art. 105 al. 2 LTF).
En ce qui concerne ses liens avec son pays d'origine, la décision entreprise ne contient aucune constatation en rapport avec d'éventuels séjours du recourant dans ce pays, mais le prénommé évoque dans son recours de très rares visites depuis son départ du Maroc en 2008. Cela étant, rien ne permet de penser que sa réinsertion professionnelle et sociale dans son pays d'origine serait difficile, dès lors qu'il y a passé la majeure partie de sa vie. Il y a notamment suivi toute sa scolarité et y a travaillé. En outre, il y a encore de la famille proche, en particulier ses parents et un frère, ce qui peut faciliter sa réintégration.
Le recourant, qui est marié depuis six ans et a un fils de sept ans, a un intérêt à poursuivre sa vie de famille en Suisse. L'expulsion serait également délicate pour son épouse et son fils, qui n'ont pas de lien avec le Maroc. A cet égard, on relève que l'épouse ne pouvait pas s'attendre à devoir vivre sa vie de couple ou de famille à l'étranger lorsqu'elle s'est mariée et a fondé une famille avec le recourant puisqu'à cette époque (naissance de l'enfant en 2014 et mariage en 2015) le prénommé, au bénéfice d'une autorisation de séjour, n'était alors nullement menacé de renvoi, l'infraction entraînant son expulsion ayant été commise postérieurement. Cependant, dans la mesure où la décision d'expulsion n'a pas été inscrite dans le Système d'information Schengen (SIS), il est envisageable que la famille s'installe au Portugal, pays dont l'épouse est ressortissante et a vécu jusqu'à l'âge de 29 ans. Quant à l'enfant, il est encore à l'âge où cela est possible de s'intégrer dans un nouveau pays. Dans cette mesure, l'expulsion ne conduit pas nécessairement à la séparation et la famille et l'intérêt privé du recourant à demeurer en Suisse en raison de ses liens familiaux peut ainsi être relativisé.
4.3.4. L'intérêt public présidant à l'expulsion du recourant s'avère important, dès lors que celui-ci a été condamné à une peine privative de liberté de 18 mois. En droit des étrangers, une révocation de l'autorisation de séjour est prévue par l'art. 62 al. 1 let. b LEI en cas de "peine privative de liberté de longue durée", c'est-à-dire toute peine privative de liberté supérieure à un an (cf. ATF 139 I 145 consid. 2.1 p. 147). Le recourant pourrait donc voir son autorisation de séjour révoquée dans les mêmes circonstances en vertu de la LEI. S'agissant plus spécifiquement de l'infraction qui entraîne l'expulsion obligatoire, soit le brigandage au sens de l'art. 140 ch. 1 al. 2 CP, on relève qu'il s'agit d'une infraction de violence qui porte atteinte à des biens juridiques précieux, en particulier la vie et l'intégrité corporelle. Dans le cas d'espèce, il ressort du dossier cantonal que B._ est apparue, devant le ministère public puis le tribunal de première instance, comme étant toujours très affectée par les faits dont elle avait été victime, expliquant notamment souffrir de troubles du sommeil et d'anxiété et avoir été obligée de vendre son restaurant car elle ne parvenait plus à bien y travailler à la suite de ces événements (auditions de B._ du 8 février 2019, pièce 3012 et du 19 décembre 2019, pièce 100072; cf. art. 105 al. 2 LTF). Les agissements du recourant ont ainsi eu un impact sérieux sur la vie de la victime, ce qui leur confèrent une gravité concrète non négligeable.
Il n'y a rien à redire sur la conduite du recourant durant le laps de temps écoulé depuis la perpétration des infractions, soit un peu plus de trois ans, durée qui n'est toutefois pas encore significative. Par ailleurs, il sied de relever que le recourant a remboursé les personnes lésées par les infractions en question dans cette affaire et leur a présenté des excuses (pièces 6028-6032; cf. art. 105 al. 2 LTF), manifestant ainsi un certain amendement. Le recourant fait en outre valoir que les quatre vols et le brigandage ont été commis dans un laps de temps très restreint, soit pendant le seul mois de juin 2018, à un moment où il souffrait d'une addiction au jeu et n'était pas traité pour cela. Il ressort d'ailleurs de l'arrêt cantonal que le recourant a entamé un suivi psychiatrique en novembre 2018, poursuivi à ce jour, et qu'il est actuellement abstinent. Les efforts consentis sur ce point sont louables. Cela étant, le recourant persiste à nier une partie des faits qui lui sont reprochés (consid. 2 supra), ce qui révèle un défaut de prise de conscience. Par ailleurs, la présente condamnation du recourant doit être mise en perspective avec ses antécédents. Ainsi, par le passé, le recourant a été condamné à cinq reprises pour différentes infractions à des peines pécuniaires avec sursis. Les infractions commises se sont déployées dans le temps (de 2009 à 2014) et n'apparaissent pas toutes liées à son statut illégal en Suisse: le recourant a été condamné en 2009 pour séjour illégal et activité lucrative sans autorisation, en 2010 pour vol, violation de domicile et recel, en 2012 pour activité lucrative sans autorisation, en 2013 pour dommages à la propriété, utilisation abusive d'une installation de télécommunication, menaces, contrainte et injure et en 2014 pour violation grave des règles de la circulation routière. Ainsi, entre son arrivée en Suisse en 2009 et les faits de la présente cause commis en 2018, le recourant a été condamné pénalement à six reprises. A l'instar de la cour cantonale, on peut relever que ces antécédents, s'ils ne comprennent pas d'infractions graves, dénotent cependant une propension à transgresser la loi en même temps qu'une incapacité à s'amender. On peut encore observer que la création d'une vie familiale n'a pas empêché le recourant de récidiver, de manière plus grave cette fois, puisqu'il est désormais condamné à une peine privative de liberté. Le bénéfice du sursis lui a été accordé sur la base d'un pronostic qui n'était pas entièrement défavorable, conformément à la jurisprudence pertinente (cf. ATF 134 IV 1 consid. 4.2.2), et non en raison de l'existence d'un pronostic favorable. Les préoccupations à cet égard ont conduit la cour cantonale à imposer une période probatoire de cinq ans, soit le maximum prévu par la loi (art. 44 al. 1 CP).
4.3.5. En définitive, s'agissant d'une personne arrivée à l'âge adulte en Suisse, qui présente de multiples antécédents et a été condamnée à une peine relativement lourde notamment pour une infraction avec une composante de violence, les intérêts publics à l'expulsion l'emportent sur l'intérêt privé de l'intéressé à demeurer en Suisse. L'expulsion est certes susceptible de porter atteinte aux relations entre le recourant, son épouse et son enfant, mais il convient de relever que cette mesure reste d'une durée limitée et qu'il est envisageable que la vie de famille se poursuive à l'étranger, en particulier dans le pays d'origine de l'épouse. L'expulsion, ordonnée pour une durée de cinq ans, s'avère par conséquent conforme au principe de la proportionnalité découlant des art. 5 al. 2 Cst. et 8 par. 2 CEDH.
5.
Compte tenu de ce qui précède, le recours doit être rejeté dans la mesure où il est recevable.
Enfin, la cause étant tranchée, la demande d'effet suspensif est sans objet, étant précisé que le recours était de plein droit suspensif en ce qui concernait la mesure d'expulsion (cf. arrêt 6B_939/2020 du 4 mars 2021 consid. 5).
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est admise. Me Valentin Aebischer est désigné en qualité de conseil d'office et une indemnité de 3'000 fr. lui est allouée à titre d'honoraires, à payer par la caisse du Tribunal fédéral.
3.
Il n'est pas perçu de frais judiciaires.
4.
Le présent arrêt est communiqué aux parties et au Tribunal cantonal de l'État de Fribourg, Cour d'appel pénal.
Lausanne, le 18 novembre 2021
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
La Présidente : Jacquemoud-Rossari
La Greffière : Musy